import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerListModel;
import javax.swing.SpinnerNumberModel;

/**
 * 
 * @author Krzysztof Marjański
 * Klasa reprezentująca widok okna dialogowego służącego do dodawania i edycji wydarzeń.
 *
 */
public class EventDialogView extends JDialog {
	/**Pole służące do wprowadzenia podsumowania*/
	public JTextField summaryField;
	/**Pole służące do wprowadzenia Lokalizacji*/
	public JTextField LocationField;
	/**Komponent służący do wybierania daty początku wydarzenia*/
	public JSpinner startDateSelector;
	/**Komponent służący do wybierania godziny początku wydarzenia*/
	public JSpinner startHourSelector;
	/**Komponent służący do wybierania daty końca wydarzenia*/
	public JSpinner endDateSelector;
	/**Komponent służący do wybierania godziny końca wydarzenia*/
	public JSpinner endHourSelector;
	/**Komponent służący do wybierania na ile minut przed zostanie przypomniane o wydarzeniu*/
	public JSpinner remindSelector;
	public JLabel eventLabel;
	public JComboBox priority;
	/**Komponent służący do wybierania Edytowanego wydarzenia*/
	public JComboBox eventSelector;
	/**Pole służące do wprowadzenia opisu*/
	public JTextArea description; 
	private JButton ok;
	private JButton cancel;
	private JPanel fields;
	private JPanel buttons;
	private EventDialog controller;
	public SpinnerNumberModel remindModel;
	
	
	/**
	 * Alokuje obiekt klasy EventDialogView oraz dodaje wszystkie komponenty.
	 * @param owner	Rodzic okna dialogowego.
	 * @param title	Tytuł okna dialogowego.
	 * @param controller Referencja do controllera - klasy EventDialog. 
	 */
	EventDialogView (Frame owner, String title, EventDialog controller)
	{
		super(owner,title,true);
		this.controller=controller;
		startDateSelector = new JSpinner();
		endDateSelector = new JSpinner();
		startHourSelector = new JSpinner();
		endHourSelector = new JSpinner();
		remindSelector = new JSpinner();
		addAllComponents();
		setLayout(new BorderLayout());
		add(fields,BorderLayout.NORTH);
		add(buttons,(BorderLayout.SOUTH));
		ActionListener l  = new Events();
		ok.addActionListener(l);
		cancel.addActionListener(l);
		eventSelector.addActionListener(l);
		setSize(500, 300);
		ok.setMnemonic(KeyEvent.VK_O);
		cancel.setMnemonic(KeyEvent.VK_A);
	}
	private JPanel createRemindSelector ()
	{
		JPanel p = new JPanel(new FlowLayout());
		remindModel = new SpinnerNumberModel(5,0,30,1);
        remindSelector.setModel(remindModel);
        p.add(remindSelector);
        p.add(new JLabel ("minut przed"));
        return p;
		
	}
	private JPanel createDateSelector (JSpinner date, JSpinner hour)
	{	 
		String  hours[] = new String [48];
		for (int h=0,j=0 ; h<24 ; h++,j+=2)
		{
			hours[j]=String.valueOf(h)+":00";
			hours[j+1]=String.valueOf(h)+":30";
		}
		
		JPanel DateSelector = new JPanel (new FlowLayout());
		SpinnerListModel hourModel = new SpinnerListModel(hours);
		SpinnerDateModel model = new SpinnerDateModel();
		date.setModel(model);
        JSpinner.DateEditor dateEditor = new JSpinner.DateEditor(date, "dd:MM:yy");
        date.setEditor(dateEditor);
        hour.setModel(hourModel);
        JComponent editor= hour.getEditor();
        JFormattedTextField ftf=((JSpinner.DefaultEditor)editor).getTextField();
        ftf.setColumns(4);
        DateSelector.add(new JLabel("Data:"));
        DateSelector.add(date);
        DateSelector.add(new JLabel("Godzina:"));
        DateSelector.add(hour);
		return DateSelector;
		
	}
	protected class Events implements ActionListener
	{
		public void actionPerformed(ActionEvent evt) 
		{
			if (evt.getSource()==ok)
			{
				controller.setExecutedFlag(true);
				setVisible(false);
			}
			if(evt.getSource()==cancel)
			{
				controller.setExecutedFlag(false);
				setVisible(false);
			}
			if (evt.getSource()==eventSelector)
			{
				controller.eventReload (eventSelector.getSelectedIndex());
			}
		}	

	}
	
	private void addAllComponents ()
	{
		String values [] = {"Niski", "Normalny", "Wysoki"};
		fields = new JPanel();
		fields.setLayout(new GridBagLayout());
		GridBagConstraints l = new GridBagConstraints();
		GridBagConstraints r = new GridBagConstraints();
		
		l.gridwidth = GridBagConstraints.RELATIVE;
        l.fill = GridBagConstraints.NONE;
        l.weightx = 0.0; 
        
        r.gridwidth = GridBagConstraints.REMAINDER;
        r.fill = GridBagConstraints.HORIZONTAL;
        r.weightx = 1.0;
        
        fields.add(eventLabel = new JLabel("Wydarzenie"),l);
        fields.add(eventSelector = new JComboBox(),r);
        eventLabel.setVisible(false);
        eventSelector.setVisible(false);
        
        fields.add(new JLabel("Nazwa"), l);
        fields.add(summaryField = new JTextField(), r);         
        fields.add(new JLabel("Miejsce"), l);
        fields.add(LocationField = new JTextField(), r);        
        fields.add(new JLabel("Początek"), l);
        fields.add(createDateSelector(startDateSelector,startHourSelector), r);    
        fields.add(new JLabel("Koniec"), l);
        fields.add(createDateSelector(endDateSelector,endHourSelector), r);
        fields.add(new JLabel("Priorytet"), l);
		priority = new JComboBox (values);
		priority.setSelectedIndex(1);
        fields.add(priority, r);
        fields.add(new JLabel ("Przypomnij"),l);
        fields.add(createRemindSelector(),r);
        fields.add(new JLabel("Opis"), l);
        description = new JTextArea(4,4);
        description.setLineWrap(true);
        JScrollPane areaScrollPane = new JScrollPane(description);
        fields.add(areaScrollPane, r);
        
        buttons = new JPanel();
        buttons.setLayout(new FlowLayout());
        buttons.add(ok = new JButton("OK"));
        buttons.add(cancel = new JButton("Anuluj"));
		
		
		
	}
}
